%{

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#ifndef YYSTYPE
#define YYSTYPE double
#endif
int yylex();
extern int yyparse();
FILE* yyin;
void yyerror(const char* s);
%}

//给每个符号定义一个单词类别
%token ADD MINUS MUL DIV LB RB
%token NUMBER //整数定义的类别

%left ADD MINUS
%left MUL DIV
%right UMINUS         

%%


lines   :       lines expr ';' { printf("%f\n", $2); }
        |       lines ';'
        |
        ;
//表达式的规则
expr    :       expr ADD expr   { $$=$1+$3; }
        |       expr MINUS expr   { $$=$1-$3; }
        |       expr MUL expr   { $$=$1*$3; }  //乘法规则
        |       expr DIV expr   { $$=$1/$3; }  //除法规则
        |       LB expr RB   { $$=$2; }
        |       MINUS expr %prec UMINUS   {$$=-$2;}
        |       NUMBER  {$$=$1;}
        ;

%%

// programs section

int yylex()
{
    int t;
    while(1){
        t=getchar();
        if(t==' '||t=='\t'||t=='\n'){
            //do noting
        }
        else if(isdigit(t)){
            //解析多位数字返回数字类型 
            int val=0; 
            do{
             val=(val*10)+t-'0';
             t=getchar();
            }while(isdigit(t)); //循环得到多位数字的值
            yylval=val; 
            ungetc(t,yyin); //把当前读取的不是数字的字符作为下次读取的字符
            return NUMBER;
        }
        else if(t=='+'){
            return ADD;
        }else if(t=='-'){
            return MINUS;
        }//识别其他符号
        else if(t=='*'){ 
            return MUL; //识别符号*
        }
        else if(t=='/'){
            return DIV; //识别符号/
        }
        else if(t=='('){
            return LB; //识别符号(
        }
        else if(t==')'){
            return RB; //识别符号)
        }
        else{
            return t;
        }
    }
}

int main(void)
{
    yyin=stdin;
    do{
        yyparse();
    }while(!feof(yyin));
    return 0;
}
void yyerror(const char* s){
    fprintf(stderr,"Parse error: %s\n",s);
    exit(1);
}
